﻿// ConsoleApplication1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include "des.h"
#include <stdio.h>
#define BUF_SIZE 1024

#pragma pack(1)
typedef struct
{
    char flag[4];	        //升级包开始字节
    uint32_t rand;          //随机数
    uint32_t version;    // 升级包版本  0为初级版本 1 增加包长检查 和校验
    uint32_t update_len; // 升级包大小    //版本1添加
    uint32_t checksum;   // 除去1K头 其他的和校验  //版本1添加
    uint32_t dat_type;  //0 工作固件 1 boot
} update_Info_t;
#pragma pack()
int main()
{
    FILE* file_in;
    FILE* file_out;
    unsigned char buffer[BUF_SIZE];
    int len = 0;
    memset(buffer, 0, BUF_SIZE);
    update_Info_t* p = (update_Info_t*)buffer;
    file_in = fopen("./motion_work.bin", "rb");
    if (file_in != NULL) 
    {
        file_out = fopen("./motion_work.dat", "wb");
        p->dat_type = 0;
        goto pack;
    }

    file_in = fopen("./motion_boot.bin", "rb");
    if (file_in != NULL)
    {
        file_out = fopen("./motion_boot.dat", "wb");
        p->dat_type = 1;
        goto pack;
    }

    return 0;

pack:
    uint32_t updatelen = 0;
    uint32_t checksum = 0;
    while (1) {
        len = fread_s(buffer, BUF_SIZE, 1, BUF_SIZE, file_in);
        if (len == 0)
            break;
        for (int i = 0; i < len; i++)
        {
            checksum += buffer[i];
            updatelen++;
        }
    }

    memset(buffer, 0, BUF_SIZE);
    p->flag[0] = 'D';
    p->flag[1] = 'S';
    p->flag[2] = 'C';
    p->flag[3] = 'X';
    p->rand = rand();
    p->version = 1;
    p->update_len = updatelen;
    p->checksum = checksum;
    EnSecurity(buffer, buffer, BUF_SIZE);
    fwrite(buffer, 1, BUF_SIZE, file_out);
    fseek(file_in, 0L, SEEK_SET);
    while (1) {
        len = fread_s(buffer, BUF_SIZE, 1, BUF_SIZE, file_in);
        EnSecurity(buffer, buffer, len);
        if (len == 0)
            break;
        fwrite(buffer, 1, len, file_out);
    }
    fclose(file_out);
    

    // 关闭文件
    fclose(file_in);


}

// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单

// 入门使用技巧: 
//   1. 使用解决方案资源管理器窗口添加/管理文件
//   2. 使用团队资源管理器窗口连接到源代码管理
//   3. 使用输出窗口查看生成输出和其他消息
//   4. 使用错误列表窗口查看错误
//   5. 转到“项目”>“添加新项”以创建新的代码文件，或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. 将来，若要再次打开此项目，请转到“文件”>“打开”>“项目”并选择 .sln 文件
